﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using _2.Logica.Inventario;
using _4.Modelado.Inventario;
using _1.Presentacion.Utilidades;
using _1.Presentacion.Principal;
using Microsoft.VisualBasic;

namespace _1.Presentacion.Modulo_Inventario
{
    public partial class Ajuste_Inventario : Päntalla_Base
    {
        private int _PK_Ajuste_Existencia;

        public Ajuste_Inventario()
        {
            InitializeComponent();
        }


        private bool esAplicado ;//Verifica si el ajuste ya fue aplicado o no

        private void Ajuste_Inventario_Load(object sender, EventArgs e)
        {
            txtPKAjuste.Text = "0";
            txt_PKDetAjuste.Text = "0";
            CargaGridAjuste();
            CargaComboBodegas();
            CargaComboRazones();
            Validaciones.CargarUsuarioLogueado(lbl_Usuario, lbl_Fecha);

        }

       
        private void btnNuevo_Click(object sender, EventArgs e)
        {
            P_Limpiar_Encabezado();
            txtAjusteObservaciones.Focus();
        }
   
        private void btnHome_Click_1(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }


        #region Encabezado Ajuste

        private void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                var obj = new Ajuste_Existencia();

                obj.sAjusteObservacion = txtAjusteObservaciones.Text;
                obj.iPK_Ajuste_Existencia = Convert.ToInt32(txtPKAjuste.Text);
                obj.iFK_Usuario = VariableGlobales.iCodigoUsuario;
                obj.cAjusteAplicado = 'N';
                if (chbSumarExistencia.Checked)
                    obj.cAjusteSumar_Inventario = 'S';
                else
                    obj.cAjusteSumar_Inventario = 'N';


                var logica = new Ajuste_ExistenciaL();

                logica.Ajuste_ExistenciaGuardar(obj);
                CargaGridAjuste();
                P_Limpiar_Encabezado();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Se produjo un error al guardar los datos" + exc, "Error", MessageBoxButtons.OKCancel);
            }

        }

        private void dgvEncabezadoAjuste_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            
            int indicefila = dgvEncabezadoAjuste.SelectedCells[0].RowIndex;
            txtPKAjuste.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells[0].Value.ToString();
            txtAjusteObservaciones.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells[2].Value.ToString();
            if (Convert.ToChar(dgvEncabezadoAjuste.Rows[indicefila].Cells[5].Value) == 'S')
                chbSumarExistencia.Checked = true;
            else
                chbSumarExistencia.Checked = false;
            if (Convert.ToChar(dgvEncabezadoAjuste.Rows[indicefila].Cells[3].Value) == 'S')
            {
                btnEliminar.Enabled = false;
                btnGuardar.Enabled = false;
                btnAplicar.Enabled = false;
                gbDetalleAjuste.Enabled = false;
                esAplicado = true;
            }
            else
            {
                btnEliminar.Enabled = true;
                btnGuardar.Enabled = true;
                btnAplicar.Enabled = true;
                gbDetalleAjuste.Enabled = true;
            }
            CargaGridDetalle();

        }

        private void txtAjusteObservaciones_KeyDown(object sender, KeyEventArgs e)
        {
            if (esAplicado != true)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    btnModificar_Click(sender, e);
                }
            }

        }

        private void btnAplicar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvDetalleAjuste.RowCount > 0)
                {
                    int indiceFila = dgvEncabezadoAjuste.SelectedCells[0].RowIndex;
                    string sDescripcion = dgvEncabezadoAjuste[1, indiceFila].Value.ToString();
                    // decimal dExistencia = Convert.ToDecimal(dgvDetalleAjuste[4, indiceFila].Value.ToString());

                 
                    DialogResult r = MessageBox.Show("Desea aplicar el ajuste: " + sDescripcion, "Validaciones",
                                                     MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                    if (r == DialogResult.OK)
                    {   
                        #region Aplica ajuste

                        var obj = new Ajuste_Existencia();


                        obj.iPK_Ajuste_Existencia = Convert.ToInt32(txtPKAjuste.Text);
                        obj.iFK_Usuario = VariableGlobales.iCodigoUsuario;


                        var logica = new Ajuste_ExistenciaL();

                        logica.Ajuste_ExistenciaAplicar(obj);
                        CargaGridAjuste();
                        MessageBox.Show("El ajuste ha sido aplicado", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        P_Limpiar_Encabezado();
                        #endregion
                    }
                 


                }
                else
                {
                    MessageBox.Show("No hay artículos asignados al ajuste" , "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Warning);    
                }
            }
            catch (Exception exc)
            {

                MessageBox.Show("Se produjo un error " + exc, "Error", MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            
        }

        private void chbSumarExistencia_CheckedChanged(object sender, EventArgs e)
        {
            if (chbSumarExistencia.Checked)
            {
                lbl_InfoAjuste.Text = "El ajuste sumará a las existencias globales";
            }
            else
            {
                lbl_InfoAjuste.Text = "El ajuste actualizará las existencias globales";
            }
        }

      


        #endregion
       

        #region Metodos
      
        private void CargaComboBodegas()
        {
            try
            {
                var logica = new BodegaL();

                cb_Bodega.DataSource = logica.LlenarComboBodega();
                cb_Bodega.ValueMember = "PK_Bodega";
                cb_Bodega.DisplayMember = "BodUbicacion";
            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar información " + exc, "Error", MessageBoxButtons.OKCancel);
            }
        }
      
        private void CargaComboRazones()
        {
            try
            {
                var logica = new RazonAjusteL();

                cb_Razon.DataSource = logica.LlenarComboRazonAjuste();
                cb_Razon.ValueMember = "PK_Razon_Ajuste";
                cb_Razon.DisplayMember = "RazonAjusteDescripcion";
            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar información " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #region Encabezado
     
        private void P_Limpiar_Encabezado()
        {
            _PK_Ajuste_Existencia = 0;
            txtPKAjuste.Text = "0";
            txtAjusteObservaciones.Clear();
            txtArticulo.Clear();
            P_Limpiar_Detalle();
            btnEliminar.Enabled = true;
            btnGuardar.Enabled = true;
            btnAplicar.Enabled = true;
            gbDetalleAjuste.Enabled = true;
            esAplicado = false;
        }

        private void CargaGridAjuste()
        {
            try
            {
                var logica = new Ajuste_ExistenciaL();

                List<Ajuste_Existencia> listaAjuste = logica.Ajuste_ExistenciaConsultar();
                //Recorre la lista de Usuarios para asignar a cada celda del Datagrid
                //Los valores devueltos por la consulta
                dgvEncabezadoAjuste.Rows.Clear();
                for (int i = 0; i < listaAjuste.Count; i++)
                {
                    dgvEncabezadoAjuste.Rows.Add();
                    dgvEncabezadoAjuste.Rows[i].Cells[0].Value = listaAjuste[i].iPK_Ajuste_Existencia;
                    dgvEncabezadoAjuste.Rows[i].Cells[1].Value = listaAjuste[i].dAjusteFecha;
                    dgvEncabezadoAjuste.Rows[i].Cells[2].Value = listaAjuste[i].sAjusteObservacion;
                    dgvEncabezadoAjuste.Rows[i].Cells[3].Value = listaAjuste[i].cAjusteAplicado;
                    dgvEncabezadoAjuste.Rows[i].Cells[4].Value = listaAjuste[i].dAjusteFechaAplico;
                    dgvEncabezadoAjuste.Rows[i].Cells[5].Value = listaAjuste[i].cAjusteSumar_Inventario;
                    dgvEncabezadoAjuste.Rows[i].Cells[6].Value = listaAjuste[i].sULogin;
                    dgvEncabezadoAjuste.Rows[i].Cells[7].Value = listaAjuste[i].iFK_Usuario;

                }

            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar la lista de ajustes " + exc, "Error", MessageBoxButtons.OKCancel);
            }

        }



        #endregion

        #region Detalle
        
        private void P_Limpiar_Detalle()
        {
            txtAjusteObservaciones.Clear();
            txt_PKDetAjuste.Text = "0";
            txtArticuloDescrp.Clear();
            txtExistencia.Clear();
        }

        public void PresentaArticulo(int xPK_Articulo, string Nombre, decimal Existencia)
        {
            txtArticulo.Text = xPK_Articulo.ToString(CultureInfo.InvariantCulture);
            txtArticuloDescrp.Text = Nombre.Trim();
            txtExistencia.Text = Existencia.ToString();
        }
     
        private void CargaGridDetalle()
        {
            try
            {
                var logica = new Det_Ajuste_ExistenciaL();

                List<Det_Ajuste_Existencia> listaDetalle = logica.Det_Ajuste_ExistenciaConsultar(Convert.ToInt32(txtPKAjuste.Text));
                //Recorre la lista de Usuarios para asignar a cada celda del Datagrid
                //Los valores devueltos por la consulta
                dgvDetalleAjuste.Rows.Clear();
                for (int i = 0; i < listaDetalle.Count; i++)
                {
                    dgvDetalleAjuste.Rows.Add();
                    //dgvDetalleAjuste.Rows[i].Cells[0].Value = listaDetalle[i].iPK_Det_Ajuste_Existencia;
                    dgvDetalleAjuste.Rows[i].Cells[0].Value = listaDetalle[i].iFK_Ajuste_Detalle;
                    dgvDetalleAjuste.Rows[i].Cells[1].Value = listaDetalle[i].iFK_Articulo_Detalle;
                    dgvDetalleAjuste.Rows[i].Cells[2].Value = listaDetalle[i].sArticuloNombre;
                    dgvDetalleAjuste.Rows[i].Cells[3].Value = listaDetalle[i].iFK_Razon_Detalle;
                    dgvDetalleAjuste.Rows[i].Cells[4].Value = listaDetalle[i].sRazonAjusteDescripcion;
                    dgvDetalleAjuste.Rows[i].Cells[5].Value = listaDetalle[i].iFK_Bodega_Det_Ajuste_Existencia;
                    dgvDetalleAjuste.Rows[i].Cells[6].Value = listaDetalle[i].sBodUbicacion;
                    dgvDetalleAjuste.Rows[i].Cells[7].Value = listaDetalle[i].dcDetalleCantidad;
                    dgvDetalleAjuste.Rows[i].Cells[8].Value = listaDetalle[i].dcArticuloExistencia_Global;
                    

                }

            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar la lista de ajustes " + exc, "Error", MessageBoxButtons.OK,MessageBoxIcon.Error);
            }

        }
        #endregion

        private void cb_Bodega_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                cb_Razon.Focus();
            }
        }

        private void cb_Razon_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnBuscararticulo.Focus();
            }
        }

        private void btnBuscarAsistente_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                txt_DetCantidad.Focus();
            }
        }
       
        #endregion

        private void txt_DetCantidad_KeyDown(object sender, KeyEventArgs e)
        {
           
            if (e.KeyCode == Keys.Enter)
            {
                try
                {
                    if (txtPKAjuste.Text!="0")
                    {
                       
                        #region Guarda Detalle
                        if (Information.IsNumeric(txt_DetCantidad.Text))
                        {
                            var obj = new Det_Ajuste_Existencia();

                           // obj.iPK_Det_Ajuste_Existencia = Convert.ToInt32(txt_PKDetAjuste.Text);
                            obj.iFK_Ajuste_Detalle = Convert.ToInt32(txtPKAjuste.Text);
                            obj.iFK_Articulo_Detalle = Convert.ToInt32(txtArticulo.Text);
                            obj.iFK_Razon_Detalle = Convert.ToInt32(cb_Razon.SelectedValue);
                            obj.iFK_Bodega_Det_Ajuste_Existencia = Convert.ToInt32(cb_Bodega.SelectedValue);
                            obj.dcDetalleCantidad = Convert.ToDecimal(txt_DetCantidad.Text);



                            var logica = new Det_Ajuste_ExistenciaL();

                            logica.Det_Ajuste_ExistenciaGuardar(obj);
                            CargaGridDetalle();
                            MessageBox.Show("El registro fue almacenado exitósamente", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            P_Limpiar_Detalle();
                        }
                        else
                            {
                                MessageBox.Show("Debe ingresar una cantidad válida", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                txt_DetCantidad.Focus();
                                txt_DetCantidad.Clear();
                            }

                            #endregion
                        
                        
                    }
                    else
                    {
                        MessageBox.Show("Debe seleccionar un encabezado", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    
                    }

                    
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Se produjo un error al guardar los datos" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
              
            }

        }


        private void btnBuscararticulo_Click(object sender, EventArgs e)
        {
            try
            {
                var pantalla = new Busca_Articulos(this);
                pantalla.FkBodega = Convert.ToInt32(cb_Bodega.SelectedValue);
                pantalla.ShowDialog();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Se produjo un error al mostrar los datos" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvEncabezadoAjuste.RowCount > 0)
                {
                    int indiceFila = dgvEncabezadoAjuste.SelectedCells[0].RowIndex;
                    string sDescripcion = dgvEncabezadoAjuste[1, indiceFila].Value.ToString();
                    // decimal dExistencia = Convert.ToDecimal(dgvDetalleAjuste[4, indiceFila].Value.ToString());

                    #region Elimina Articulo

                    DialogResult r = MessageBox.Show("Desea eliminar el ajuste: " + sDescripcion, "Validaciones",
                                                     MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                    if (r == DialogResult.OK)
                    {
                        //if (dExistencia <= 0)
                        //{
                        var obj = new Ajuste_Existencia();
                        obj.iPK_Ajuste_Existencia = Convert.ToInt32(dgvEncabezadoAjuste.Rows[indiceFila].Cells[0].Value);


                        var logica = new Ajuste_ExistenciaL();
                        logica.Ajuste_ExistenciaEliminar(obj);
                        CargaGridAjuste();
                        MessageBox.Show("El registro se ha eliminado exitósamente", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        P_Limpiar_Detalle();


                        //}
                        //else
                        //{
                        //    MessageBox.Show("No se puede eliminar el artículo, tiene existencias en bodega ", "Error", MessageBoxButtons.OKCancel);
                        //}


                    }
                 

                    #endregion
                }


            }
            catch (Exception exc)
            {

                if (exc.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                {
                    MessageBox.Show("El registro tiene datos asosciados, asegúrese de que no tenga datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("No se pudo eliminar el registro " + exc, "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                }
            }
        }

        private void btn_EliminarDetalle_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvDetalleAjuste.RowCount > 0)
                {
                    int indiceFila = dgvDetalleAjuste.SelectedCells[0].RowIndex;
                    string sDescripcion = dgvDetalleAjuste[1, indiceFila].Value.ToString();
                    int iFKAjuste = Convert.ToInt32(dgvDetalleAjuste.Rows[indiceFila].Cells[0].Value);
                    int iFKBodega = Convert.ToInt32(dgvDetalleAjuste.Rows[indiceFila].Cells[5].Value);
                    int iFKArticulo = Convert.ToInt32(dgvDetalleAjuste.Rows[indiceFila].Cells[1].Value);
                   // decimal dExistencia = Convert.ToDecimal(dgvDetalleAjuste[4, indiceFila].Value.ToString());

                    #region Elimina Articulo

                    DialogResult r = MessageBox.Show("Desea eliminar el artículo: " + sDescripcion, "Validaciones",
                                                     MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                    if (r == DialogResult.OK)
                    {
                        //if (dExistencia <= 0)
                        //{
                            var obj = new Det_Ajuste_Existencia();
                            obj.iFK_Ajuste_Detalle = iFKAjuste;
                            obj.iFK_Bodega_Det_Ajuste_Existencia = iFKBodega;
                            obj.iFK_Articulo_Detalle = iFKArticulo;

                            var logica = new Det_Ajuste_ExistenciaL();
                            logica.Det_Ajuste_ExistenciaEliminar(obj);
                            CargaGridDetalle();
                            MessageBox.Show("El registro se ha eliminado exitósamente", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                           P_Limpiar_Detalle();


                        //}
                        //else
                        //{
                        //    MessageBox.Show("No se puede eliminar el artículo, tiene existencias en bodega ", "Error", MessageBoxButtons.OKCancel);
                        //}



                    }

                    #endregion
                }


            }
            catch (Exception exc)
            {

                if (exc.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                {
                    MessageBox.Show("El registro tiene datos asosciados, asegúrese de que no tenga datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("No se pudo eliminar el registro " + exc, "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                }
            }
        }

        private void dgvDetalleAjuste_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                int indicefila = dgvDetalleAjuste.SelectedCells[0].RowIndex;
                txtArticulo.Text = dgvDetalleAjuste.Rows[indicefila].Cells[1].Value.ToString();
                txtArticuloDescrp.Text = dgvDetalleAjuste.Rows[indicefila].Cells[2].Value.ToString();
                cb_Razon.SelectedValue = Convert.ToBoolean(dgvDetalleAjuste.Rows[indicefila].Cells[3].Value);
                cb_Bodega.SelectedValue = dgvDetalleAjuste[5, indicefila].Value.ToString();
                txt_DetCantidad.Text = dgvDetalleAjuste[7, indicefila].Value.ToString();
                txtExistencia.Text = dgvDetalleAjuste[8, indicefila].Value.ToString();
                txt_DetCantidad.Focus();
                
            }
            catch (Exception exc)
            {

                MessageBox.Show("Se produjo un error al mostrar los datos" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
        }

     
      
        







      
      

             
    }

}
